package tp.pr5.mv.instructions.mem;

import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.Opcode;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.traps.IncorrectDirEx;
import tp.pr5.mv.traps.MVTrap;
import tp.pr5.mv.traps.WithoutOperandsEx;

public class STOREIND extends Instruction {

	public STOREIND() {
		op = Opcode.STOREIND;
	}
	
	
	public void execute(OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod) throws MVTrap {
			
		if ( stack.getCounter() < 2 )     // Necesitamos al menos dos operandos en la pila.
			throw new WithoutOperandsEx( this, stack.getCounter() );
		
		
		int a = stack.top();    // Cogemos la cima de la pila
		int b = stack.subtop(); // Cogemos la subcima de la pila
		
		if ( !mem.write(b, a))    // Si no podemos escibir en la posición es que es incorrecta (negativa).
			throw new IncorrectDirEx ( this, b );
		
		
		stack.pop();        // Sólo se quita los valores de cima y subcima si ha tenido éxito la escritura.
		stack.pop();
	
	}

}
